#include <iostream>
using std::cout;
#include <list>
#include <algorithm>
#include <iterator>

template<typename T>void printList(const std::list<T> &list2);
int main()
{
	const int L=4;
	int a[L]={2,6,4,8};
	std::list<int>valori;
	std::list<int>alteValori;

	valori.push_front(1);
	valori.push_front(2);
	valori.push_back(4);
	valori.push_back(3);
	cout<<"Inainte de sortare= ";
	printList(valori);
	cout<<"\nDupa sortare= ";
	valori.sort();
	printList(valori);
	alteValori.insert(alteValori.begin(),a,a+L);
	cout<<"\nDupa inserare= ";
	printList(alteValori);
	valori.splice(valori.end(),alteValori);
	printList(alteValori);
	cout<<"\nDupa copierea lui alteValori vectorul contine= ";
	printList(valori);
	valori.sort();
	cout<<"\nDupa sortare= ";
	printList(valori);
	alteValori.insert(alteValori.begin(),a,a+L);
	alteValori.sort();
	cout<<"\nDupa sortare alte valori contine= ";
	printList(alteValori);
	valori.merge(alteValori);
	cout<<"\nDupa ce am aplicat 'merge' valori contine= ";
	printList(valori);
	valori.pop_front();
	valori.pop_back();
	cout<<"\nDupa ce am scos un el din fata si unul din spate= ";
	printList(valori);
	valori.unique();
	cout<<"\nDupa ce am eliminat dublurile= ";
	printList(valori);
	valori.swap(alteValori);
	cout<<"\nSchimbarea valorilor in alta lista= ";
	printList(valori);
	printList(alteValori);
	valori.assign(alteValori.begin(),alteValori.end());
	cout<<"\nDupa asignare el valori contine= ";
	valori.merge(alteValori);
	printList(valori);
	valori.remove(2);
	cout<<"\nDupa ce am sters valorile de 2= ";
	printList(valori);
	
	return 0;
}
template<typename T>void printList(const std::list<T> &lista)
{
	if(lista.empty())
		cout<<"Lista este vida";
	else
	{
		std::ostream_iterator<T>out(cout," ");
		std::copy(lista.begin(),lista.end(),out);
	}
}
